package br.edu.ufcg.dsc.lp2.projeto.tests.model;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.junit.Assert;

import br.edu.ufcg.dsc.lp2.projeto.model.Estabelecimento;
import br.edu.ufcg.dsc.lp2.projeto.model.PopularidadeGlobal;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.EnderecoInvalidoException;


public class PopularidadeGlobalTest {

	@Before
	public void setUp() throws EnderecoInvalidoException {
		estabelecimentos = new ArrayList<Estabelecimento>();
		
		e1 = new Estabelecimento("Girassol - (-4)", 
				"R Irineu Joffily 263 - Centro", "A la carte");
		
		e2 = new Estabelecimento("Baixinho Bar e Restaurante - 4", 
				"Rua papa João XXIII, 101, Liberdade", "A la carte");
		
		e3 = new Estabelecimento("Cantina da Sayonara - 0", 
				"Campus da UFCG, praça do bloco BD", "Prato feito");
		
		e4 = new Estabelecimento("Super China Restaurante - 9", 
				"Shopping Luiza Mota", "Self-service");
		
		e5 = new Estabelecimento("Spolleto - 15", 
				"Shopping Boulevard", "A la carte");

		// adiciona votos
		e1.votar(-1);
		e1.votar(-1);
		e1.votar(-1);
		e1.votar(-1);
		
		e2.votar(-1);
		e2.votar(0);
		e2.votar(5);
		
		e3.votar(0);
		
		e4.votar(4);
		e4.votar(5);
		
		e5.votar(5);
		e5.votar(5);
		e5.votar(5);
		
		// adiciona a lista
		estabelecimentos.add(e1);
		estabelecimentos.add(e2);
		estabelecimentos.add(e3);
		estabelecimentos.add(e4);
		estabelecimentos.add(e5);			
	}
	
	@Test
	public void numeroInvalido() {
		try {
			PopularidadeGlobal.retorna("", estabelecimentos);
			Assert.fail("Nao deveria ter chegado aqui");
		} catch (Exception e) {
			Assert.assertEquals("Numero nao pode ser vazio ou nulo", e.getMessage());
		}

		try {
			PopularidadeGlobal.retorna(null, estabelecimentos);
			Assert.fail("Nao deveria ter chegado aqui");
		} catch (Exception e) {
			Assert.assertEquals("Numero nao pode ser vazio ou nulo", e.getMessage());
		}
		
		try {
			PopularidadeGlobal.retorna("0", estabelecimentos);
			Assert.fail("Nao deveria ter chegado aqui");
		} catch (Exception e) {
			Assert.assertEquals("Numero deve ser maior que 0", e.getMessage());
		}
		
		try {
			PopularidadeGlobal.retorna("-4", estabelecimentos);
			Assert.fail("Nao deveria ter chegado aqui");
		} catch (Exception e) {
			Assert.assertEquals("Numero deve ser maior que 0", e.getMessage());
		}
		
		try {
			PopularidadeGlobal.retorna("10", estabelecimentos);
			Assert.fail("Nao deveria ter chegado aqui");
		} catch (Exception e) {
			Assert.assertEquals("Numero maior que o numero de estabelecimentos", e.getMessage());
		}
		
	}
	
	@Test
	public void ordenaPopularidadeTest() {
		// Antes de ordenar
		Assert.assertEquals(-4, estabelecimentos.get(0).getPopularidade());
		Assert.assertEquals(4, estabelecimentos.get(1).getPopularidade());
		Assert.assertEquals(0, estabelecimentos.get(2).getPopularidade());
		Assert.assertEquals(9, estabelecimentos.get(3).getPopularidade());
		Assert.assertEquals(15, estabelecimentos.get(4).getPopularidade());
		
		estabelecimentos = PopularidadeGlobal.retorna("5", estabelecimentos);

		// Depois de ordenar
		Assert.assertEquals(15, estabelecimentos.get(0).getPopularidade());
		Assert.assertEquals(9, estabelecimentos.get(1).getPopularidade());
		Assert.assertEquals(4, estabelecimentos.get(2).getPopularidade());
		Assert.assertEquals(0, estabelecimentos.get(3).getPopularidade());
		Assert.assertEquals(-4, estabelecimentos.get(4).getPopularidade());	
	}
	
	private Estabelecimento e1, e2, e3, e4, e5;
	private List<Estabelecimento> estabelecimentos;

}